package com.two.shopping.controller;

import com.two.shopping.pojo.Admin;
import com.two.shopping.pojo.Result;
import com.two.shopping.pojo.User;
import com.two.shopping.service.ILoginService;
import com.two.shopping.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

/*这是一个Controller类，也就是登录的控制层，用于接收前端的get,post等请求
接受并交给服务层
下面是该Controller类所具有的方法{
" loginUser(@RequestBody User user) " : "用于用户登录"
“ loginAdmin(@RequestBody Admin admin) ”:"用于管理员登录"
” createUser(@RequestBody User user)“ : "用于用户注册"
事实上，我们并没有提供管理员的注册方法，我们认为管理员应该在后台可添加(或数据库)，
而不是随随便便就可以注册
}

* */
@Slf4j
@RequestMapping("/user")
@RestController
public class LoginController {
    @Autowired
    private ILoginService loginService;

    /*这是用户信息登录模块，前端接收用户的用户名和密码
    * 后端进行表单验证，当验证成功后后端将返回数据
    * 以下是一次成功的请求
    * {
    "code": 1,
    "msg": "success",
    "data": {
        "id": 0,
        "name": null,
        "username": "张三",
        "password": "100200",
        "gender": 0,
        "phone": null,
        "image": null,
        "address": null,
        "createTime": null,
        "updateTime": null
    }
}*/
    @CrossOrigin
    @PostMapping("/login")
    public Result loginUser(@RequestBody User user) {
        log.info("用户信息登录{}", user.getUsername(), user.getPassword());
        try {
            User user1 = loginService.userLogin(user);
            if (user1 != null) {
                Map<String, Object> claims = new HashMap<>();
                claims.put("id", user.getId());
                claims.put("name", user.getName());
                claims.put("username", user.getUsername());
                String jwt = JwtUtils.generateJwt(claims);//jwt包含了当前用户的信息
                return Result.success(jwt);
            }
        } catch (Exception e) {

            e.printStackTrace();
            return Result.error("用户名或密码错误");
        }
        return Result.error("用户名或密码错误");
    }
    @CrossOrigin
    @PostMapping("/admin")
    public Result loginAdmin(@RequestBody Admin admin) {
        log.info("管理员信息登录{}", admin.getAdminName(), admin.getAdminPassword());
        try {
            Admin admin1 = loginService.adminLogin(admin);

            if (admin1 != null) {
                Map<String, Object> claims = new HashMap<>();
                claims.put("id", admin.getId());
                claims.put("username", admin.getAdminName());

                String jwt = JwtUtils.generateJwt(claims);//jwt包含了当前用户的信息
                return Result.success(jwt);
            }
        } catch (Exception e) {

            e.printStackTrace();
            return Result.error("用户名或密码错误");
        }
        return Result.error("用户名或密码错误");
    }

    /*这是用户信息注册模块，前端接收用户的用户名、密码和手机号
     * 后端进行表单验证，首先验证手机号是否已经被注册，如果手机号则会
     * 抛出异常，并给前端”注册错误，可能是您的手机号已被注册“的返回信息
     * 以下是一次成功的请求
     * {
    "code": 1,
    "msg": "success",
    "data": {
        "id": 0,
        "name": null,
        "username": "王五2",
        "password": "100200",
        "gender": 0,
        "phoneNumber": "177900131675",
        "image": null,
        "address": null,
        "createTime": "2024-06-14T10:54:58.1099314",
        "updateTime": "2024-06-14T10:54:58.1099314"
        }
        * 这是一次失败的样例
        * {
    "code": 0,
    "msg": "注册错误，可能是您的手机号已被注册",
    "data": null

    }
}
     */
    @CrossOrigin
    @PostMapping("/register")
    public Result createUser(@RequestBody User user) {
        log.info("用户注册{}", user);
        try {
            User user1 = loginService.createUser(user);
            return Result.success(user);
        } catch (Exception e) {
            e.printStackTrace();
            return Result.error("注册错误，可能是您的手机号已被注册或者是用户名重复");
        }


    }
}
